05Java面向对象的编程OOP 您所在的位置:网站首页 labview oop重写 05Java面向对象的编程OOP

05Java面向对象的编程OOP

2023-03-30 21:00| 来源: 网络整理| 查看: 265

(备案于2023年1月5日,作用:04方法重写与多态,备案号:2301050504)

29.方法的重写或方法的覆盖(overriding)

在子类中可以根据需求对从父类的方法进行重新编写,称为方法的重写或方法的覆盖 (overriding)。

案例:

package e;

public class Father {

private String name;

public Father() {

}

public Father(String name) {

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String skill(){

return "父亲的技能是:砍树";

}

}

package e;

public class Son extends Father{

private String surname;

public Son() {

}

public Son(String name, String surname) {

super(name);

this.surname = surname;

}

public String getSurname() {

return surname;

}

public void setSurname(String surname) {

this.surname = surname;

}

@Override

public String skill() {

return "儿子的新技能是:除草";

}

}

package e;

public class Test {

public static void main(String[] args) {

Son s = new Son();

System.out.println(s.skill());

Father f = new Father();

System.out.println(f.skill());

}

}

30.方法重写规则

方法名相同参数列表相同返回值类型相同或者是其子类访问权限不能严于父类父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)父类的私有方法不能被子类覆盖不能抛出比父类方法更多的异常

31.方法重写与方法重载

31.1.方法重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型、访问修饰符无关。

31.2方法重写涉及的是子类和父类之间的同名方法,要求方法名相、参数列表相同、返回值类型相同 (或是其子类)、访问修饰符不能严于父类。

32.Object类

32.1所有的Java类都直接或间接地继承Java.lang.Object类。Object类是Java类的祖先。在定义一个类时,如果没有使用extends关键字,那么这个类直接继承Object类。

32.2Object类中有很多方法经常被重写。

33.Equals()方法与instanceof()方法

Equals()方法是用来比较两个字符串(String)是否相等的方法。

案例1:

package exercise;

public class Demo02 {

public static void main(String[] args) {

String a = "你好";

String b = "你好";

if (a.equals(b)){

System.out.println("相同");

}

}

}

Equals()方法在OOP的实际应用中,通常需要重写,用于比较对象数组中的元素是否相同。

案例2:

package exercise;

public class Demo03 {

private String name;

private int age;

public Demo03() {

}

public Demo03(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public boolean equals(Object obj) {

Demo03 d = (Demo03)obj;

return this.name==d.name&&this.age==d.age;

}

}

package exercise;

public class Demo03Test {

public static void main(String[] args) {

Demo03 d1 = new Demo03("李",10);

Demo03 d2 = new Demo03("李",10);

if (d1.equals(d2)){

System.out.println("相同");

}

}

}

Instanceof()方法,也是用来比较的,不过它是java的一个二元操作符,和=,这些是类似的,主要的作用,是为了测试左边的对象,是不是右边的类的实例,返回的是boolean值。

案例:

package exercise;

public class Demo04a {

}

package exercise;

public class Demo04b {

}

package exercise;

public class Demo04c {

}

package exercise;

public class Demo04Test {

public static void main(String[] args) {

Demo04a a = new Demo04a();

Demo04b b = new Demo04b();

Demo04c c = new Demo04c();

System.out.println(a instanceof Demo04a);

System.out.println(b instanceof Demo04a);

System.out.println(c instanceof Demo04a);//由于JDK版本不同,这句编译可能报错

}

}

34.Final

34.1final表示最终的,不可变的。

34.2final修饰的类(无法被继承)。

34.3final修饰的方法(无法被覆盖,重写)。

34.4final修饰的局部变量(只能赋一次值)。

34.5final修饰的实例变量(必须手动赋值)。

34.6final修饰引用(只能指向一个对象)。

35.多态

多态指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态;可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。

36.多态的特点

36.1多态的前提1:是继承

36.2多态的前提2:要有方法的重写

36.3父类引用指向子类对象,如:Animal a = new Cat();

36.4多态中,编译看左边,运行看右边

案例:

package exercise;

//父类

class Animal{

public void eat(){

System.out.println("小动物Animal吃啥都行");

}

}

//子类1

class Cat extends Animal{

public void eat(){

System.out.println("小猫爱吃小鱼干");

}

public void jump(){

System.out.println("小猫Cat跳的高!");

}

}

//子类2

class Dog extends Animal{

@Override

public void eat(){

System.out.println("小狗爱吃肉骨头");

}

public void run(){

System.out.println("小狗Dog跑的快!");

}

}

public class Demo05 {

public static void main(String[] args) {

Animal a = new Animal();

Cat c = new Cat();

Dog d = new Dog();

//所有类都进行,常规调用

a.eat();

c.eat();

c.jump();

d.eat();

d.run();

System.out.println();

//观察使用多态后的调用

Animal c1 = new Cat();

Animal d1 = new Dog();

c1.eat();

//c1.jump();无法使用

d1.eat();

//d1.jump();无法使用

}

}

37.多态中父类与子类的关系

37.1、若子类覆盖了某方法,则父类引用调用子类重新定义的新方法

37.2、若子类未覆盖某方法,则父类引用调用父类本身的旧方法

37.3、子类无论是否覆盖了某属性,但父类引用仍调用父类本身的旧属性。

案例:

package exercise;

//父类

class Father{

public String name="王";

public int age=20;

public void myName(){

System.out.println("王");

}

public void myAge(){

System.out.println("10");

}

}

//子类

class Son extends Father{

public int age=10;

@Override

public void myName() {

System.out.println("李");;

}

}

//测试类

public class Demo06 {

public static void main(String[] args) {

Father s = new Son();

s.myName();//37.1、若子类覆盖了某方法,则父类引用调用子类重新定义的新方法

s.myAge();//37.2、若子类未覆盖某方法,则父类引用调用父类本身的旧方法

//37.3、子类无论是否覆盖了某属性,但父类引用仍调用父类本身的旧属性。

System.out.println(s.name);

System.out.println(s.age);

}

}

38.向上转型

定义:向上转型指通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法;父类引用变量无法调用子类特有的方法。

优点:向上转型,好处:隐藏了子类型,提高了代码的扩展性。坏处:只能使用父类的功能,不能使用子类特有功能,功能被限定。

使用场景:不需要面对子类型,通过提高扩展性,或者使用父类的功能即可完成操作,就是使用向上转型。

案例:

package exercise;

//父类

class Father{

public void myName(){

System.out.println("王");

}

}

//子类

class Son extends Father{

@Override

public void myName() {

System.out.println("李");

}

public void myAge(){

System.out.println("10");

}

}

//测试类

public class Demo07 {

public static void main(String[] args) {

Father s = new Son();//向上转型

s.myName();

s.myAge();//此处编译错误,原因是父类引用变量无法调用子类特有的方法

}

}

39.向下转型

定义:向下转型指将一个指向子类对象的父类引用赋给一个子类的引用,即:父类类型转换为子类类型。需强制类型转换。

好处:可以使用子类型的特有功能。坏处:面对具体的子类型,向下转型具有风险。即容易发生ClassCastException,只要转换类型和对象不匹配就会发生。解决方法:使用关键字instanceof。

案例:

package exercise;

//父类

class Father{

public void myName(){

System.out.println("王");

}

}

//子类

class Son extends Father{

@Override

public void myName() {

System.out.println("李");

}

public void myAge(){

System.out.println("10");

}

}

//测试类

public class Demo06 {

public static void main(String[] args) {

Father s = new Son();//向下转型

Son s1 = (Son)s;

s1.myName();

s1.myAge();

}

}

40.栈、堆、方法区的区别?静态变量与实例变量的储存位置?

答:静态变量位于方法区;实例变量位于堆区。

所有定义的方法的信息都保存在方法区,此区属于共享区间。

类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。

堆在逻辑上分为三部分 新生区 + 养老区 + 永久区

Java虚拟机的内存可以分为三个区域:栈stack、堆heap、方法区method area,方法区其实在堆的内部。JVM的内存总构成为栈和堆。

41.java方法区和本地方法区_java中的栈、堆、方法区、本地方法区的讲解

https://blog.csdn.net/weixin_34639033/article/details/114746367?ops_request_misc=&request_id=&biz_id=102&utm_term=本地方法区&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-114746367.142^v59^js_top,201^v3^add_ask&spm=1018.2226.3001.4187

作业:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有